import pymysql
from pymysql.err import InternalError
"""
如果输入数值数据怎么办？依然是在python中字符串的形式输入到数据库中吗?

"select * from wechat_news where age <=17 and sex = 1;"
"select * from wechat_news where class like '%四班%'; %表示省略的字" 
"select * from wechat_news where class like '%四班%' order by age asc;  asc表示升序，desc表示降序"
"""
class MySql():
    def __init__(self,host='localhost',port=3306,user='root',password='074057',db='spread_news',charset='utf8'):
        try:
            self.cnnt = pymysql.connect(host=host,port=port,user=user,password=password,db=db,charset=charset)
        except Exception as e:
            print('与数据库联接失败。')
            print('详情:\n%s' %e)
        else:
            print('与数据联接成功。\n')
            self.cursor = self.cnnt.cursor()
            self.db = db
            # 得到一个可以执行SQL语句并且将结果作为字典返回的游标
    
    def _stack_text(self,lst,times=1,separation=','):
        "输入一个由字符组成的list对象，或者一个字符串对象，加上需要重复的次数，分隔默认为是','"
        if isinstance(lst,list):
            pass
        elif isinstance(lst,str):
            lst = [lst]*times
        else:
            print('只接受字符串列表和字符串。')
            return
        try:
            res = separation.join(lst)
            return res
        except:
            print('存在非字符串对象。')
            return

    def add(self,table,message):
        column = list(message.keys())
        values = []
        for i in column:
            values.append(message[i])
        part_a = 'insert into %s(%s)' %(table,self._stack_text(column))
        part_b = ' values(%s)' %self._stack_text('%s',times=len(column))
        mysql_command = part_a + part_b
        #print(mysql_command)
        self.cursor.execute(mysql_command,values)
        self.cnnt.commit()
        print('数据已保存至数据库——%s中的表格——%s中' %(self.db,table))

    def delete(self,table,index):
        pass

    def query(self,index,table='wechat_news'):
        "index是由栏目名与需要查询的栏目的值组成，table表示数据库的名称"
        sql="select * from {0} where {1} like '%{2}%';".format(table,index[0],index[1])
        try:
            res_num = self.cursor.execute(sql) #返回搜索到的结果的个数
        except InternalError:
            print('所查询的栏目并不存在。\n')
            return ()
        if not res_num:
            print('没有查到对应数据。\n')
            return ()
        res = self.cursor.fetchall() #返回一个元组，由按列表头前后顺序排列的信息组成的元组组成
        return res
    
    def query_data(self):
        pass

    def close_cursor(self):
        self.cursor.close()

    def close(self):
        self.close_cursor()
        self.cnnt.close()
    
if __name__ == '__main__':
    MS = MySql()
    message_1={
        'title':'GBN观察 | 西川广人危机加重',
        'url':'https://mp.weixin.qq.com/s/bUq1K7gz3PJWdWRAhLUaZw',
        'date':'2019-07-26',
    }
    message_2={'score':'3'}
    MS.add('test',message_2)
    MS.close()
